home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
aminet
/
misc
/
amag
/
12b92.lha
/
Tips & Tricks
/
Form. Strings (Assembler)
/
tip.txt
< prev
next >
Wrap
Text File
|
1992-11-02
|
3KB
|
81 lines
Formatierte Strings in Assembler
Welcher Assemblerprogrammierer hat nicht schon neidisch
auf die Kollegen aus der C-Ecke geschaut, wenn es um
formatierte Strings geht. »FormatStr.asm« macht dem nun ein Ende.
Es handelt sich dabei um eine kleine Routine, die die
Funktion »RawDoFmt()« aufruft. Diese unterstützt
allerdings nicht alle C-spezifischen
Format-Codes; es werden keine Fließkomma und
Oktalzahlen unterstützt. Folgende Codes können benutzt werden:
(1) %c - Das nächste Argument in der Liste wird als ein Buchstabe
interpretiert. Dieser wird anstelle des %c eingesetzt.
(2) %d - Das nächste Argument in der Liste wird als Dezimalzahl mit
Vorzeichen interpretiert. Diese wird anstelle des %d
eingesetzt.
(3) %x - Das nächste Argument in der Liste wird als Hexadezimalzahl
interpretiert. Diese wird anstelle des %x eingesetzt.
(4) %s - Das nächste Argument in der Liste wird als Zeiger auf einen mit
einem NULL Byte beendeten String interpretiert. Dieser wird
anstelle des %s eingesetzt.
Wenn Sie vor den Format Code ein 'l' setzen (zum Beispiel %lx) wird das
zugehörige Argument als longword interpretiert. Es können auch die
folgende Zeichen in den Format Code eingefügt werden:
(1) Ein Minuszeichen bewirkt, daß das entsprechende Argument
linksbündig in den String eingesetzt wird. (zum Beispiel %-d)
(2) Eine Zahl bestimmt die maximale größe des Feldes. Was darüber hinaus
geht wird abgeschnitten (zum Beispiel %5d). Eine führende 0 bewirkt bei
einem String, daß wenn der String kleiner als die bestimmte Feldgröße
ist, alle fehlenden Zeichen durch Leerzeichen ersetzt werden (zum
Beispiel %019s). Bei Zahlen werden fehlende Ziffern durch Nullen
ersetzt (zum Beispiel %08x).
Die Argumentenübergabe gestaltet sich etwas kompliziert. Da man
ja mehr als 7 Argumente übergeben kann, fallen die Adressregister
als Übergabemöglichkeiten weg. Wir wählen den Weg über den Stack.
Das geht folgendermaßen: Sie haben zum Beispiel folgenden zu
formatierenden String:
"Mein Name ist: %s. Ich bin %d Jahre alt"
Jetzt müssen die Argumente von hinten nach vorne auf den Stack gelegt
werden. Zuerst muß also das Alter auf den Stack:
move.w #120,-(a7)
Und dann der Name:
pea Name
Wobei Name mit dc.b definiert werden muß und mit einem NULL Byte endet:
Name: dc.b "Ottokar",0
Jetzt liegen alle Argumente in der richtigen Reihenfolge auf dem Stack.
Nun kann, wenn alle anderen Parameter angegeben sind (siehe Listing)
aufgerufen werden. Nach Beendigung der Routine muß der Stac
k wieder korrigiert werden. Um wieviel Bytes, hängt davon ab wieviel
Argumente daraufgelegt wurden. In unserem Fall wurde er um 6 Bytes
niedriger (move.w = 2 Bytes (WORD) pea = 4 Bytes (LONGWORD)). Nun
muß er also auch wieder um 6 Byte erhöht werden:
lea 6(a7),a7
Er hat nun wieder den alten Wert. Würde das vergessen, kämen die ganzen
Rücksprungadressen durcheinander, was irgendwann einen Freiflug nach Indien
heraufbeschwört. Das Listing FormatDemo.asm soll nur als Beispiel
dienen. Wichtig ist die Routine FormatStr. Das
Programm läßt sich mit dem A68k (Fish 521) und Blink (Fish 351) übersetzen:
A68K Format.asm
Blink Format.o